package com.dfbz.demo03_Constructor;

import com.dfbz.demo02_Class.Cate;
import org.junit.Test;

import java.lang.reflect.Constructor;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo02_Constructor的功能 {

    // 调用空参构造
    @Test
    public void test1() throws Exception {
        // 获取字节码对象
        Class<Cate> cateClass = Cate.class;

        // 获取构造方法:获取空参构造
        Constructor<Cate> constructor = cateClass.getConstructor();

        // 调用这个constructor构造器锁描述的方法,不传递参数
        Cate cate = constructor.newInstance();

        System.out.println(cate);
    }



    @Test
    public void test2() throws Exception {

        // 1. 先获取字节码对象
        Class<Cate> cateClass = Cate.class;

        // 根据参数列表去获取一个public修饰的方法
        Constructor<Cate> constructor = cateClass.getConstructor(String.class, String.class, Boolean.class);

        Cate cate = constructor.newInstance("瓦罐汤","鲜香",true);

        System.out.println(cate);
    }




    @Test
    public void test3() throws Exception {

        // 1. 获取字节码对象
        Class<Cate> cateClass = (Class<Cate>) Class.forName("com.dfbz.demo02_Class.Cate");

        // 2. 获取指定的构造器(如果不是public修饰的记得要使用getDeclaredConstructor)
        Constructor<Cate> constructor = cateClass.getDeclaredConstructor(String.class, String.class);

        // 开启强制访问,只要不是public修饰的构造方法都需要开启强制访问
        constructor.setAccessible(true);

        // 3. 传递参数调用具体的构造方法
        Cate cate = constructor.newInstance("冰淇淋", "甜");

        System.out.println(cate);
    }

}
